package com.fang.algorithm.leecode;

/**
 * @author fanglingxiao
 * @version 1.0
 * @description 跳跃游戏2
 * 给你一个非负整数数组nums ，你最初位于数组的第一个位置。
 * <p>
 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。
 * <p>
 * 你的目标是使用最少的跳跃次数到达数组的最后一个位置。
 * <p>
 * 假设你总是可以到达数组的最后一个位置。
 * <p>
 * 输入: nums = [2,3,1,1,4]
 * 输出: 2
 * 解释: 跳到最后一个位置的最小跳跃数是 2。
 * 从下标为 0 跳到下标为 1 的位置，跳1步，然后跳3步到达数组的最后一个位置。
 * <p>
 * 输入: nums = [2,3,0,1,4]
 * 输出: 2
 **/
public class L45_CanJump2 {
    public static void main(String[] args) {
        int[] nums = new int[]{2, 3, 1, 1, 4};
        int minStep = jump(nums);
        System.out.println(minStep);
    }

    private static int jump(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        // ans步数
        int step = 0;
        // 当前位置能跳跃的最远距离
        int currMax = 0;
        // 下一个位置能跳跃的最远距离
        int nextMax = nums[0];
        for (int i = 0; i < nums.length; i++) {
            if (currMax < i) {
                step++;
                currMax = nextMax;
            }
            nextMax = Math.max(nextMax, i + nums[i]);
        }
        return step;
    }
}
